﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LogicaNegocio;
using Entidades;
namespace PresentacionEscritorio
{
    public partial class frmRegistrarPaciente : Form, IOpcion
    {
        private GestorDePaciente GP = new GestorDePaciente();
        private GestorObraSocial GOS = new GestorObraSocial();
        private GestorBarrio GB = new GestorBarrio();
        private GestorLocalidad GL = new GestorLocalidad();
        private GestorSexos GS = new GestorSexos();
        private GestorDomicilio GD = new GestorDomicilio();
        private GestorTiposDocumento GTD = new GestorTiposDocumento();
        private DataGridViewButtonColumn cEliminar = new DataGridViewButtonColumn();
        private DataTable dTObraSocialPaciente = new DataTable();
        private List<ObraSocialXPaciente> listOSAgregadas = new List<ObraSocialXPaciente>();
        private Paciente oP;
        private Domicilio oD;

        private string opcionElegida;


        enum estadOOSS
        {
            seleccionado,
            Noseleccionado
        }
        estadOOSS oEOSS = estadOOSS.Noseleccionado;

        public frmRegistrarPaciente()
        {
            InitializeComponent();
        }

        private void frmRegistrarPaciente_Load(object sender, EventArgs e)
        {


            panelOOSS.Enabled = false;
            //Fecha Actual
            DateTime diaActual = DateTime.Today;
            //Establecemos el numero de HC
            txtNumeroHistoriaClinica.Text = Convert.ToString(GP.ObtenerUltimoNroHCPaciente() + 1);
            //Cargamos Localidades

            cargarLocalidad();
            //Carga Sexo
            cargarSexo();
            //Carga Tipo documento
            cargarTipoDocumento();
            //Nombre de la columna seleccionado.
            cEliminar.HeaderText = "Eliminar";
            cEliminar.Text = "Eliminar celda";
        }
        private void cargarSexo()
        {
            if (GS.obtenerSexos() == null)
            {
                MessageBox.Show("No estan cargados los Sexos");
            }
            else
            {
                cmbSexo.DataSource = GS.obtenerSexos();
                cmbSexo.ValueMember = "codSexo";
                cmbSexo.DisplayMember = "Nombre";
            }


        }

        private void cargarLocalidad()
        {
            if (GL.ObtenerTodos() == null)
            {
                MessageBox.Show("No estan cargados las localidades");
            }
            else
            {
                cmbLocalidad.DataSource = GL.ObtenerTodos();
                cmbLocalidad.ValueMember = "idLocalidad";
                cmbLocalidad.DisplayMember = "nombre";
                cargarBarrios(int.Parse(cmbLocalidad.SelectedValue.ToString()));
            }

        }
        private void cargarBarrios(int localidad)
        {
            if (GB.ObtenerTodos(localidad) == null)
            {
                MessageBox.Show("No estan cargados los barrios");
            }
            else
            {
                cmbBarrio.DataSource = GB.ObtenerTodos(localidad);
                cmbBarrio.ValueMember = "idBarrio";
                cmbBarrio.DisplayMember = "nombre";

            }

        }
        private void cargarTipoDocumento()
        {

            if (GTD.obtenerTipoDocumento() == null)
            {
                MessageBox.Show("No estan cargados los Tipos de documentos");
            }
            else
            {
                cmbTipoDoc.DataSource = GTD.obtenerTipoDocumento();
                cmbTipoDoc.ValueMember = "Codigo";
                cmbTipoDoc.DisplayMember = "Nombre";
            }


        }



        private void RegistrarPaciente()
        {
            try
            {
                //VALIDAMOS LOS DATOS
                if (validarDatos())
                {
                    oP = new Paciente();
                    oP.nroHC = long.Parse(txtNumeroHistoriaClinica.Text);
                    oP.Nombre = txtNombre.Text;
                    oP.Apellido = txtApellido.Text;
                    oP.CodTipoDoc = int.Parse(cmbTipoDoc.SelectedValue.ToString());
                    oP.NroDocumento = long.Parse(txtNumDocumento.Text);
                    oP.FechaNacimiento = Convert.ToDateTime(dtFechaNacimiento.Text);
                    //VERIFICAR LOS TIPOS DE ESTADOS DEL PACIENTE
                    oP.idEstadoPaciente = 1;
                    oP.nroHC = long.Parse(txtNumeroHistoriaClinica.Text);
                    oP.CodSexo = int.Parse(cmbSexo.SelectedValue.ToString());

                    if (!string.IsNullOrEmpty(txtTelefono.Text))
                    {
                        oP.Telefono = long.Parse(txtTelefono.Text);
                    }
                    if (!txtCelular.Text.ToString().Equals(""))
                    {
                        oP.Celular = long.Parse(txtCelular.Text);
                    }
                    if (!mskCorreoelectronico.Text.ToString().Equals(""))
                    {
                        oP.Mail = mskCorreoelectronico.Text;
                    }
                    //DOMICiLIO
                    oD = new Domicilio();
                    oD.calle = txtCalle.Text;
                    oD.numero = int.Parse(txtNroCalle.Text);

                    if (!string.IsNullOrEmpty(txtCodigoPostal.Text))
                    {
                        oD.codPostal = int.Parse(txtCodigoPostal.Text);
                    }
                    if (!string.IsNullOrEmpty(txtDepartamento.Text))
                    {
                        oD.Departamento = txtDepartamento.Text;
                    }
                    if (!string.IsNullOrEmpty(txtPiso.Text))
                    {
                        oD.piso = int.Parse(txtPiso.Text);
                    }
                    

                    //BARRIO 

                    oD.idBarrio = int.Parse(cmbBarrio.SelectedValue.ToString());





                    //REGISTRAR PACIENTE CON DOMICILIO  Y OOSS. Se debera registrar el domicilio en el paciente
                    //Cargamos el dataTablaOS a una lista de Obras sociales por paciente
                    if (dTObraSocialPaciente.Rows.Count != 0)
                    {
                        if (GP.ObtenerIdTipoPaciente("Obra Social") > 0)
                        {
                            oP.idTipoPaciente = GP.ObtenerIdTipoPaciente("Obra Social");

                        }
                        //FALTA VERIFICAR SI DA 0 que no se registraron LOS TIPOS PACIENTE.

                        foreach (DataRow item in dTObraSocialPaciente.Rows)
                        {
                            //creamos un string nombre para acceder a la base de datos y obtener la OOSS.

                            ObraSocial oS = null;
                            string nombre = item["Siglas"].ToString();
                            oS = GOS.ObtenerExistenciaOOSSPorNOmbre(nombre);

                            if (oS != null)
                            {
                                ObraSocialXPaciente oOP = new ObraSocialXPaciente();
                                oOP.idObraSocial = oS.idObraSocial;
                                oOP.nroAfiliado = long.Parse(item["Numero de afiliado"].ToString());
                                listOSAgregadas.Add(oOP);
                                oOP = null;
                            }
                        }
                    }
                    else
                    {
                        if (GP.ObtenerIdTipoPaciente("Particular") > 0)
                        {
                            oP.idTipoPaciente = GP.ObtenerIdTipoPaciente("Particular");
                        }


                    }
                    if (GP.registrarPaciente(oP, oD, listOSAgregadas) > 0)
                    {
                        MessageBox.Show("Se registró con exito el paciente: " + "\n Nombre: " + oP.Nombre + "\n Apellido: " + oP.Apellido, "Registro exitoso");
                    }
                    else
                    {
                        MessageBox.Show("No se pudo registrar el paciente");

                    }
                }

            }
            catch (Exception Ex)
            {

                MessageBox.Show(Ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }




        private bool validarDatos()
        {
            bool validacion = true;
            string error = "";

            if (!string.IsNullOrEmpty(txtPiso.Text))
            {
                int piso;
                bool resultado;
                resultado = int.TryParse(txtPiso.Text, out piso);
                if (!resultado)
                {
                    validacion = false;
                    error += "El numero de piso debe ser un numero\r\n";
                }

            }
            if (!string.IsNullOrEmpty(txtCodigoPostal.Text))
            {
                int cp;
                bool resultado;
                resultado = int.TryParse(txtCodigoPostal.Text, out cp);
                if (!resultado)
                {
                    validacion = false;
                    error += "El codigo postal debe ser numerico\r\n";
                }

            }
            if (string.IsNullOrEmpty(txtApellido.Text))
            {
                validacion = false;
                error += "El Apellido del Paciente es requerido\r\n";
            }
            if (string.IsNullOrEmpty(txtNombre.Text))
            {
                validacion = false;
                error += "El nombre del Paciente es requerido\r\n";
            }

            if (cmbTipoDoc.ValueMember == null)
            {
                validacion = false;
                error += "El Tipo de documento del paciente debe seleccionarse\r\n";
            }
            //if (msktbFechaActual.Text == null)
            //{
            //    validacion = false;
            //    error += "El numero de documento del paciente debe seleccionarse\r\n";

            //}


            if (cmbSexo.ValueMember == null)
            {
                validacion = false;
                error += "El Sexo del paciente debe seleccionarse\r\n";
            }

            if (string.IsNullOrEmpty(txtNumDocumento.Text))
            {
                validacion = false;
                error += "El numero de documento debe ingresarse\r\n";
            }
            else
            {
                long numero;
                bool resul = long.TryParse(txtNumDocumento.Text, out numero);

                if (!resul)
                {
                    validacion = false;
                    error += "El numero de documento debe ser unicamente numerico\r\n";
                }
                else if (validarExistencia())
                {
                    validacion = false;
                    error += "La persona ya se encuentra registrada\r\n";
                }

            }

            if (dtFechaNacimiento == null)
            {
                validacion = false;
                error += "La fecha de nacimiento del paciente debe ingresarse de hoy\r\n";

            }
            else if (Convert.ToDateTime(dtFechaNacimiento.Text) >= DateTime.Now.Date)
            {
                validacion = false;
                error += "La fecha de nacimiento desde debe ser una fecha igual o menor a la fecha actual\r\n";
            }


            if (string.IsNullOrEmpty(txtCalle.Text))
            {
                validacion = false;
                error += "La calle debe ingresarse \r\n";
            }

            if (string.IsNullOrEmpty(txtNroCalle.Text))
            {
                validacion = false;
                error += "El número calle debe ingresarse \r\n";
            }
            else
            {
                long numero;
                bool resul = long.TryParse(txtNroCalle.Text, out numero);

                if (!resul)
                {
                    validacion = false;
                    error += "El numero de calle debe ser unicamente numerico\r\n";
                }
            }

            if (cmbLocalidad.ValueMember == null)
            {
                validacion = false;
                error += "La localidad debe seleccionarse \r\n";
            }
            if (cmbBarrio.ValueMember == null)
            {

                validacion = false;
                error += "El barrio debe seleccionarse\r\n";
            }

            if (oEOSS == estadOOSS.seleccionado)
            {

                if (cmbObraSocial.ValueMember == null)
                {
                    validacion = false;
                    error += "La Obra social del paciente debe seleccionarse \r\n";

                }
                if (string.IsNullOrEmpty(mskNumafiliado.Text))
                {
                    validacion = false;
                    error += "El numero de afiliado de Obra social del paciente debe ingresarse \r\n";

                }

            }


            if (error != "")
            {
                MessageBox.Show(error, "Aviso", MessageBoxButtons.OK);
            }
            return validacion;

        }

        private bool validarExistencia()
        {//Aca validamos la existencia de la persona que se quiere registrar como paciente.
            long numdoc = long.Parse(txtNumDocumento.Text);
            return GP.VerificarExistenciaPorNumDoc(long.Parse(txtNumDocumento.Text));


        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            //Cada vez que cambie el chk a true cargamos las OOSS
            if (chkObraSocial.Checked == true)
            {
                panelOOSS.Enabled = true;
                try
                {
                    //Cargamos el comboBox de obra social y el datagrid de las OOSS.


                    if (GOS.ObtenerTodos().Rows.Count == 0)//Verificamos que haya alguna OOSS cargada
                    {

                        MessageBox.Show("No estan las Obra Sociales registradas");


                        return;
                    }
                    else
                    {

                        cmbObraSocial.DataSource = GOS.ObtenerTodos();
                        cmbObraSocial.ValueMember = GOS.ObtenerTodos().Columns["idObraSocial"].ToString();
                        cmbObraSocial.DisplayMember = GOS.ObtenerTodos().Columns["siglasOS"].ToString();

                    }
                    if (!grdObraSocial.Columns.Contains(cEliminar))
                    {
                        dTObraSocialPaciente = new DataTable();
                        dTObraSocialPaciente.Columns.Add("Obra Social");
                        dTObraSocialPaciente.Columns.Add("Siglas");
                        dTObraSocialPaciente.Columns.Add("Numero de afiliado");
                        grdObraSocial.DataSource = dTObraSocialPaciente;
                        grdObraSocial.Columns.Add(cEliminar);


                    }

                }
                catch (Exception Ex)
                {

                    throw new Exception(Ex.Message);
                }

            }
            else
            {

                panelOOSS.Enabled = false;
                if (dTObraSocialPaciente.Rows.Count > 0)
                {
                    dTObraSocialPaciente = null;
                    grdObraSocial.Columns.Remove(cEliminar);
                    grdObraSocial.DataSource = null;
                }

            }
        }

        private void cmbLocalidad_SelectionChangeCommitted(object sender, EventArgs e)
        {
            cargarBarrios(int.Parse(cmbLocalidad.SelectedValue.ToString()));
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            DialogResult rs = MessageBox.Show("¿Desea salir del programa?", "Salir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rs == DialogResult.Yes)
            {
                this.Close();
            }

        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            //Agregamos las Obra sociales que posee el paciente.
            if (cmbObraSocial.ValueMember != null)
            {
                int resultado = 0;
                if (!mskNumafiliado.Text.ToString().Equals(""))
                {
                    foreach (DataRow item in dTObraSocialPaciente.Rows)
                    {
                        if (item["Siglas"].ToString().Equals(cmbObraSocial.Text))
                        {
                            resultado = 1;
                            MessageBox.Show("La obra social ya fue seleccionada", "informacion", MessageBoxButtons.OK);
                        }
                    }
                    if (resultado == 0)
                    {
                        //Obtenemos el nombre de la Obra social
                        string nombreOS = "hola";
                        int idObraSocial;
                        foreach (DataRow item in GOS.ObtenerTodos().Rows)
                        {


                            if (item["siglasOS"].ToString().Equals(cmbObraSocial.Text))
                            {

                                nombreOS = item["nombreObraSocial"].ToString();
                                idObraSocial = int.Parse(item["idObraSocial"].ToString());

                                break;
                            }
                        }
                        dTObraSocialPaciente.Rows.Add(nombreOS, cmbObraSocial.Text, mskNumafiliado.Text);

                    }


                }
                else
                {
                    MessageBox.Show("Debera ingresar el numero de afiliado", "Informacion", MessageBoxButtons.OK);
                }
            }
            else
            {
                MessageBox.Show("No existen Obras sociales registradas", "Informacion", MessageBoxButtons.OK);

            }

        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            DialogResult rs = MessageBox.Show("¿Agregar Paciente?", "Salir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rs == DialogResult.Yes)
            {
                RegistrarPaciente();
            }

        }

        private void grdObraSocial_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (grdObraSocial.Columns[e.ColumnIndex].HeaderText.Equals("Eliminar"))
            {
                dTObraSocialPaciente.Rows.RemoveAt(e.RowIndex);
            }
        }

        public void setOpcion(string op)
        {
            opcionElegida = op;
        }

        public string getOpcion()
        {
            return opcionElegida;
        }

        private void btnTomarFoto_Click(object sender, EventArgs e)
        {
            frmTomarFoto formFoto = new frmTomarFoto();
            formFoto.setFormPaciente(this);
            formFoto.Show();
        }
        public void cargarFoto(string rutaFoto)
        {
            string pathFoto = rutaFoto;
            if (pathFoto != null)
            {
                pictureBoxTomarFotoPaciente.ImageLocation = pathFoto;
            }
            pictureBoxTomarFotoPaciente.SizeMode = PictureBoxSizeMode.StretchImage;
        }
    }
}
